package it.csi.finregio.finreges.integration;

import java.util.ResourceBundle;

import it.crp.dao.DAOService;
import it.crp.dao.DAOUtil;
import it.crp.dao.config.DbParam;
import it.crp.dao.config.Query;
import it.crp.exception.ServiceException;
import it.crp.logger.PrdLoggerFactory;
import it.csi.finregio.finreges.dto.Classificazione;
import it.csi.finregio.finreges.dto.Direzione;
import it.csi.finregio.finreges.dto.Ente;
import it.csi.finregio.finreges.dto.Riferimento;
import it.csi.finregio.finreges.dto.Settore;
import it.csi.finregio.finreges.dto.SottoClassificazione;
import it.csi.finregio.finreges.dto.TipoRiferimento;

import org.apache.log4j.Logger;

public class ManutenzioneTabelleService {

	
	private transient Logger log = PrdLoggerFactory.getInstance().getLogger("finreges");
	private transient ResourceBundle bundle = ResourceBundle.getBundle("queries-manutenzione");
	
	public void insertClassificazione(Classificazione classificazione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::insertClassificazione] BEGIN");
		Query query = new Query(bundle.getString("insert.classificazione"));
		try {
			doQuery(query,"insertClassificazione",classificazione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::insertClassificazione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::insertClassificazione] END");
		}
	}
	
	public void updateClassificazione(Classificazione classificazione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::updateClassificazione] BEGIN");
		try {
			Query query = new Query(bundle.getString("update.classificazione"));
			doQuery(query, "updateClassificazione", classificazione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::updateClassificazione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::updateClassificazione] END");
		}
		
	}
	
	public void deleteClassificazione(Classificazione classificazione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::deleteClassificazione] BEGIN");
		try {
			Query query = new Query(bundle.getString("delete.classificazione"));
			doQuery(query, "deleteClassificazione", classificazione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::deleteClassificazione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::deleteClassificazione] END");
		}
		
	}
	
	public void insertSottoClassificazione(SottoClassificazione sottoClassificazione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::insertSottoClassificazione] BEGIN");
		Query query = new Query(bundle.getString("insert.sottoclassificazione"));
		try {
			doQuery(query,"insertSottoClassificazione",sottoClassificazione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::insertSottoClassificazione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::insertSottoClassificazione] END");
		}
	}
	
	public void updateSottoClassificazione(SottoClassificazione sottoClassificazione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::updateSottoClassificazione] BEGIN");
		Query query = new Query(bundle.getString("update.sottoclassificazione"));
		try {
			doQuery(query,"updateSottoClassificazione",sottoClassificazione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::updateSottoClassificazione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::updateSottoClassificazione] END");
		}
	}
	
	public void deleteSottoClassificazione(SottoClassificazione sottoClassificazione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::deleteSottoClassificazione] BEGIN");
		Query query = new Query(bundle.getString("delete.sottoclassificazione"));
		try {
			doQuery(query,"idSottoclassificazione",sottoClassificazione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::deleteSottoClassificazione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::deleteSottoClassificazione] END");
		}
	}
	
	
	public void insertEnte(Ente ente) throws ServiceException{
		log.info("[ManutenzioneTabelleService::insertEnte] BEGIN");
		Query query = new Query(bundle.getString("insert.ente"));
		try {
			doQuery(query,"insertEnte",ente);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::insertEnte]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::insertEnte] END");
		}
	}
	
	public void updateEnte(Ente ente) throws ServiceException{
		log.info("[ManutenzioneTabelleService::updateEnte] BEGIN");
		Query query = new Query(bundle.getString("update.ente"));
		try {
			doQuery(query,"updateEnte",ente);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::updateEnte]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::updateEnte] END");
		}
	}
	
	public void deleteEnte(Ente ente) throws ServiceException{
		log.info("[ManutenzioneTabelleService::deleteEnte] BEGIN");
		Query query = new Query(bundle.getString("delete.ente"));
		try {
			doQuery(query,"idEnte",ente);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::deleteEnte]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::deleteEnte] END");
		}
	}

	public void insertDirezione(Direzione direzione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::insertDirezione] BEGIN");
		Query query = new Query(bundle.getString("insert.direzione"));
		try {
			doQuery(query,"insertDirezione",direzione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::insertDirezione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::insertDirezione] END");
		}
	}
	
	public void updateDirezione(Direzione direzione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::updateDirezione] BEGIN");
		Query query = new Query(bundle.getString("insert.direzione"));
		try {
			deleteDirezione(direzione);
			doQuery(query,"insertDirezione",direzione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::updateDirezione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::updateDirezione] END");
		}
	}
	
	public void deleteDirezione(Direzione direzione) throws ServiceException{
		log.info("[ManutenzioneTabelleService::deleteDirezione] BEGIN");
		Query query = new Query(bundle.getString("delete.direzione"));
		try {
			doQuery(query,"progressivoDirezione",direzione);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::deleteDirezione]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::deleteDirezione] END");
		}
	}
	
	
	public void insertSettore(Settore settore) throws ServiceException{
		log.info("[ManutenzioneTabelleService::insertSettore] BEGIN");
		Query query = new Query(bundle.getString("insert.settore"));
		try {
			doQuery(query,"insertSettore",settore);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::insertSettore]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::insertSettore] END");
		}
	}
	
	
	public void updateSettore(Settore settore) throws ServiceException{
		log.info("[ManutenzioneTabelleService::updateSettore] BEGIN");
		Query query = new Query(bundle.getString("insert.settore"));
		try {
			deleteSettore(settore);
			doQuery(query,"insertSettore",settore);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::updateSettore]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::updateSettore] END");
		}
	}
	
	public void deleteSettore(Settore settore) throws ServiceException{
		log.info("[ManutenzioneTabelleService::deleteSettore] BEGIN");
		Query query = new Query(bundle.getString("delete.settore"));
		try {
			doQuery(query,"idSettore",settore);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::deleteSettore]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::deleteSettore] END");
		}
	}
	
	public void insertTipoRiferimentoNormativo(TipoRiferimento tipoRiferimento) throws ServiceException{
		log.info("[ManutenzioneTabelleService::insertTipoRiferimentoNormativo] BEGIN");
		Query query = new Query(bundle.getString("insert.tipoRiferimento"));
		try {
			doQuery(query,"insertTipoRiferimento",tipoRiferimento);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::insertTipoRiferimentoNormativo]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::insertTipoRiferimentoNormativo] END");
		}
	}
	
	public void updateTipoRiferimentoNormativo(TipoRiferimento tipoRiferimento) throws ServiceException{
		log.info("[ManutenzioneTabelleService::updateTipoRiferimentoNormativo] BEGIN");
		Query query = new Query(bundle.getString("update.tipoRiferimento"));
		try {
			doQuery(query,"updateTipoRiferimento",tipoRiferimento);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::updateTipoRiferimentoNormativo]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::updateTipoRiferimentoNormativo] END");
		}
	}
	
	public void deleteTipoRiferimentoNormativo(TipoRiferimento tipoRiferimento) throws ServiceException{
		log.info("[ManutenzioneTabelleService::deleteTipoRiferimentoNormativo] BEGIN");
		Query query = new Query(bundle.getString("delete.tipoRiferimento"));
		try {
			doQuery(query,"idTipoRiferimento",tipoRiferimento);
		} catch (Exception e) {
			log.error(
					"[ManutenzioneTabelleService::deleteTipoRiferimentoNormativo]  "
							+ e.getMessage(), e);
			throw new ServiceException(e.getMessage());
		}finally{
			log.info("[ManutenzioneTabelleService::deleteTipoRiferimentoNormativo] END");
		}
	}
	

	/**
	 * 
	 * @param query
	 * @param name il nome del blocco xml nel file statement.xml con la posizione dei parametri da valorizzare
	 * @param object
	 * @throws Exception
	 */

	private void doQuery(Query query, String name,
			Object object) throws Exception {
		log.info("[ManutenzioneTabelleService::insert] BEGIN");
		DbParam[] params = DAOUtil.fillQueryParams(name, object);
		query.addAllParams(params);
		DAOService daoService = getDaoService();
		boolean result = daoService.update(DBConstants.FINREGIO_DBNAME, query);
		log.info("[ManutenzioneTabelleService::insert] END");
		
	}

	public DAOService getDaoService() {
		return new DAOService();
	}
}
